fix X serial handling to cope with wraparounds and maintain referential
authorTim Janik <timj@imendio.com>
Tue, 28 Aug 2007 15:26:23 +0000 (15:26 +0000)
committerMathias Hasselmann <hasselmm@src.gnome.org>
Tue, 28 Aug 2007 15:26:23 +0000 (15:26 +0000)
Thu Aug 23 15:32:09 2007  Tim Janik  <timj@imendio.com>

* gdk/x11/gdkgeometry-x11.c (_gdk_window_process_expose): fix
X serial handling to cope with wraparounds and maintain referential
integrity when removing list nodes. based on a patch by Hui Wang,
fixes #461648.

svn path=/trunk/; revision=18693

ChangeLog
gdk/x11/gdkgeometry-x11.c

index f9bdfd45bbfa037d6cfbc0477edc7bb9c3460091..218715dfe1b04bbdd5e2c0dac204f3a66fdce06a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Aug 23 15:32:09 2007  Tim Janik  <timj@imendio.com>
+
+       * gdk/x11/gdkgeometry-x11.c (_gdk_window_process_expose): fix
+       X serial handling to cope with wraparounds and maintain referential
+       integrity when removing list nodes. based on a patch by Hui Wang,
+       fixes #461648.
+
 2007-08-27  Stefan Kost  <ensonic@users.sf.net>
 
        * gtk/gtkwindow.c: Update menu accelerators, when adding/removing
index 55b2040eedf0649720b9e5e54040a095bc5ba670..2b476cfb103688454f7db129eda159a34e302bf1 100644 (file)
@@ -1052,7 +1052,7 @@ gdk_window_queue (GdkWindow          *window,
          GdkWindowQueueItem *item = tmp_list->data;
          GList *next = tmp_list->next;
          
-         if (serial > item->serial)
+          if (serial - item->serial < 0x7FFFFFFF)
            {
              queue_delete_link (display_x11->translate_queue, tmp_list);
              queue_item_free (item);
@@ -1142,9 +1142,7 @@ _gdk_window_process_expose (GdkWindow    *window,
       while (tmp_list)
        {
          GdkWindowQueueItem *item = tmp_list->data;
-         tmp_list = tmp_list->next;
-         
-         if (serial < item->serial)
+          if (item->serial - serial < 0x7FFFFFFF)
            {
              if (item->window == window)
                {
@@ -1172,10 +1170,10 @@ _gdk_window_process_expose (GdkWindow    *window,
            }
          else
            {
-             queue_delete_link (display_x11->translate_queue, 
-                                display_x11->translate_queue->head);
+             queue_delete_link (display_x11->translate_queue, tmp_list);
              queue_item_free (item);
            }
+         tmp_list = tmp_list->next;
        }
     }